package com.suxin.http;

import com.alibaba.nacos.common.constant.ResponseHandlerType;
import com.alibaba.nacos.common.utils.JacksonUtils;
import com.suxin.http.response.handler.BeanResponseHandler;
import com.suxin.http.response.handler.ResponseHandler;
import com.suxin.http.response.handler.ResultRestResponseHandler;
import com.suxin.http.response.handler.StringResponseHandler;

import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.Map;

/**
 * @author Tang
 * @classname AbstractRestTemplate
 * @description [ 抽象的 RestTemplate ]
 * @date 2023/3/2 18:53
 */
public abstract class AbstractRestTemplate {

    private final Map<String, ResponseHandler> responseHandlerMap = new HashMap<>(16);

    public AbstractRestTemplate() {
        initDefaultResponseHandler();
    }

    public void initDefaultResponseHandler() {
        responseHandlerMap.put(ResponseHandlerType.STRING_TYPE, new StringResponseHandler());
        responseHandlerMap.put(ResponseHandlerType.RESTRESULT_TYPE, new ResultRestResponseHandler());
        responseHandlerMap.put(ResponseHandlerType.DEFAULT_BEAN_TYPE, new BeanResponseHandler());
    }

    public void registerResponseHandler(String key,ResponseHandler responseHandler) {
        responseHandlerMap.put(key, responseHandler);
    }

    /**
     * 选择一个 ResponseHandler
     * @return
     */
    public ResponseHandler selectResponseHandler(Type responseType) {
        ResponseHandler responseHandler = null;
        if (responseType == null) {
            return responseHandlerMap.get(ResponseHandlerType.STRING_TYPE);
        }
        final String className = JacksonUtils.constructJavaType(responseType).getRawClass().getName();
        responseHandler = responseHandlerMap.get(className);
        // 没有就给 bean type
        if (responseHandler == null) {
            return responseHandlerMap.get(ResponseHandlerType.DEFAULT_BEAN_TYPE);
        }
        return responseHandler;
    }

}
